Aakriti Poudel
  • Home
  • About
  • Resources
  • Posts

On this page

  • About this blog post
  • Highlights
  • Dataset descriptions
  • Analysis 1: Visualizing fire scars through false color
  • Data Analysis Sections
    • Setup
    • Import fire perimeterdata
    • Import NetCDF data
  • 4. Restoring geospatial information
  • 5. True color image
  • 6. False color image
  • 7. Map

Mapping 2025 Eaton and Palisades fires: Environmental and social impacts

MEDS
geospatial
python
eji
Examining the effects of the 2025 Eaton and Palisades fires on ecosystems and communities through remote sensing
Author

Aakriti Poudel

Published

November 29, 2025

Link to GitHub repository: Mapping environmental and social impacts of Eaton and Palisades fires

About this blog post

The Eaton and Palisades fires, which ignited almost simultaneously in early January 2025, showed not only the ecological vulnerability of Los Angeles County’s foothill and coastal wild-land urban interface zones but also the deep social dimensions embedded within wildfire disasters. Using remote sensing tools such as Landsat based false color imagery, environmental monitoring efforts can clearly delineate burn severity, vegetation loss and fire scar patterns that acts as critical information for assessing ecological recovery and guiding restoration. Yet the impacts of these fires extended far beyond the physical landscape. Thousands of homes were destroyed, tens of thousands of residents were displaced, and long standing inequities shaped who suffered most, who could rebuild and how quickly communities could recover. Factors such as income level, housing security, access to insurance, language barriers, transportation availability, and trust in public institutions strongly influenced how individuals responded to evacuation orders, accessed emergency services, and navigated post-fire assistance. By integrating advanced data visualization with an understanding of these social realities, environmental monitoring becomes not only a scientific exercise but also a tool for informing more just, community-centered wildfire resilience planning

This analysis combines the environmental monitoring with social vulnerability data to show how the Eaton and Palisades fires affected both the natural landscape and the communities living within it.

Highlights

The analysis illustrates Python-based approaches for geospatial investigation: - Use xarray and rioxarray to create false-color images from Landsat 8 SWIR, NIR, and Red bands, revealing burn scars. - Combine raster satellite data with vector layers (fire perimeters and census tracts) in geopandas to integrate multiple data sources. - Maintain spatial accuracy by managing coordinate reference systems with rio.write_crs() and to_crs(). - Perform environmental justice analysis by using spatial joins and clipping to examine socioeconomic vulnerability in the burn-affected areas.

Dataset descriptions

Simplified collection of bands from the Landsat Collection 2 Level-2**

This dataset is a simplified collection of bands (red, green, blue, near-infrared and shortwave infrared) from the Landsat Collection 2 Level-2 atmosperically corrected surface reflectance data, collected by the Landsat 8 satellite. The data was retrieved from the Microsoft Planetary Computer data catalogue and clipped to an area surrounding the fire perimeters.

Fire perimeters for the Eaton and Palisades fires**

This dataset is dissolved fire perimeters/boundaries for Eaton and Palisades fires. The data can be accessed from the County of Los Angeles Open Data.

Environmental Justice Index (EJI) Data

The 2024 California Environmental Justice Index (EJI), developed by the CDC and ATSDR, offers census tract-level information on both environmental and socioeconomic factors. This analysis utilizes the dataset to examine demographic characteristics, poverty levels, and environmental burden indicators across communities in California.

Analysis 1: Visualizing fire scars through false color

Data Analysis Sections

Setup

Code
# Import required libraries
import os
import numpy as np
import pandas as pd
import xarray as xr
import rioxarray as rxr
import geopandas as gpd
import matplotlib.pyplot as plt
#from matplotlib_scalebar.scalebar import ScaleBar

Import fire perimeterdata

Fire perimeter data define the spatial extent of the fires, enabling focused analysis on the most impacted areas. Each dataset includes polygon geometries representing the fire boundaries, along with corresponding area and perimeter measurements.

Code
# Use geopandas.read_file() to read the file
eaton = gpd.read_file("data/Eaton_Perimeter_20250121/Eaton_Perimeter_20250121.shp")
palisades = gpd.read_file("data/Palisades_Perimeter_20250121/Palisades_Perimeter_20250121.shp")

Import NetCDF data

  • Explore the data and write a brief summary of the information you obtained from the preliminary information. Your summary should include the a description of the data’s variables, dimensions, and coordinates.
Code
# Import the Landsat data using xr.open_dataset().
landsat = xr.open_dataset("data/landsat8-2025-02-23-palisades-eaton.nc")

Summary of the NetCDF dataset This dataset is a remote sensing raster dataset loaded as xarray.Dataset. The total size of the dataset is 78MB. The dataset exploration gave an information on dimensions, coordinates nad data variables.

There are two spatial dimensions on dataset. The (y: 1418) represents the vertical spatial dimension (rows) and (x: 2742) represents the horizontal spatial dimension (columns).

The dataset has coordinate arrays for both x and y, stored as float64 values that corresponds to their respective spatial map coordinates. There is a only one time coordinate stored as datetime64[ns], that indicates when the image was taken.

There are five different spectral bands: red, green, blue, nir08 and swir22, and they have the same pixel grid (float32). A spatial_ref variable is also included to store the map projection information.

4. Restoring geospatial information

Check the coordinate reference system of the landsat data and transform as necessary.

  1. Use rio.crs to print what is the CRS of this dataset. Is this a geospatial object?
Code
# Check CRS of the dataset
print(landsat.rio.crs)
None
  1. Print the CRS by using accesing the spatial_ref.crs_wkt attribute of the dataset.
Code
# Print CRS of the dataset
print(landsat.spatial_ref.crs_wkt)
PROJCS["WGS 84 / UTM zone 11N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32611"]]
  1. Recover the geospatial information by using rio.write_crs() and the spatial reference information from part b.
Code
# Recover the geospatial information
print(landsat.rio.write_crs(landsat.spatial_ref.crs_wkt, inplace=True))
<xarray.Dataset> Size: 78MB
Dimensions:      (y: 1418, x: 2742)
Coordinates:
  * y            (y) float64 11kB 3.799e+06 3.799e+06 ... 3.757e+06 3.757e+06
  * x            (x) float64 22kB 3.344e+05 3.344e+05 ... 4.166e+05 4.166e+05
    time         datetime64[ns] 8B ...
    spatial_ref  int64 8B 0
Data variables:
    red          (y, x) float32 16MB ...
    green        (y, x) float32 16MB ...
    blue         (y, x) float32 16MB ...
    nir08        (y, x) float32 16MB ...
    swir22       (y, x) float32 16MB ...
  1. Print the CRS of the updated dataset.
Code
# Print the CRS of the updated dataset
print(landsat.rio.crs)
EPSG:32611

5. True color image

To create a True color image, follow the following steps:

  1. Without creating any new variables:
  • select the red, green, and blue variables (in that order) of the xarray.Dataset holding the Landsat data,
  • convert it to a numpy.array using the to_array() method, and then
  • use .plot.imshow() to create an RGB image with the data. There will be two warnings, that’s ok.
  1. Adjust the scale used for plotting the bands to get a true color image. HINT: Check the robust parameter. *The issue here is the clouds: their RGB values are outliers and cause the other values to be squished when plotting.
Code
# Select the red, green and blue variables, convert it to a numpy.array and create an RGB image
landsat[['red', 'green', 'blue']].to_array().plot.imshow(robust = True)
/opt/anaconda3/envs/eds220-env/lib/python3.11/site-packages/matplotlib/cm.py:478: RuntimeWarning: invalid value encountered in cast
  xx = (xx * 255).astype(np.uint8)

  1. To resolve the other warning, identify which bands have nan values. HINT: There are many ways of doing so. One option is to use numpy.isnan().
Code
# Identify 'nan' values in bands
for i in ['red', 'green', 'blue']:
    # .isnull() creates a boolean array (True where NaN)
    # .sum() sums the True values (counts the NaNs)
    # .item() converts the single result to a standard Python integer
    nan_count = landsat[i].isnull().sum().item()
    print(f"The {i} band has {nan_count} Nan values.")
The red band has 0 Nan values.
The green band has 1 Nan values.
The blue band has 109 Nan values.
  1. Use the .fillna() mehtod for xarray.Datasets to substitute the any nan values in the Landsat data for zero.
Code
# Substitute any 'nan' values in the Landsat data for zero
landsat = landsat.fillna(0)
  1. Create a new true color image that gets plotted without warnings.
Code
# Create a new true color image without warnings
landsat[['red', 'green', 'blue']].to_array().plot.imshow(robust = True)

A brief explanation comparing the ouputs for parts (a) and (e).

The first true color image (part a) was plotted directly from the red, green and blue bands without modifying the dataset. The image worked, but we got warnings because some of the data had Nan (missing) values. These missing values caused problems during plotting. Additionally, due to the presence of very bright cloud pixels, many of the other colors appeared darker or washed out, even when using the robust=True to ignore extreme outliers.

In part (part e), we replaced all Nan values with zeros before plotting again. This removed the missing values issue allowing the plot to scale the data more smoothly. So, the second true color image displayed without warnings. The second true color image looks cleaner and has better contrast. It doesn’t have the plotting problems seen in the first image.

6. False color image

Without creating any new variables, create a false color image by plotting the short-wave infrared (swir22), near-infrared, and red variables (in that order).

Code
# Create false color image (SWIR2, NIR, Red)
landsat[['swir22', 'nir08', 'red']].to_array().plot.imshow(robust = True)
plt.title('False Color Image (SWIR2-NIR-Red)')
plt.show()

7. Map

  1. Create a map showing the shortwave infrared/near-infrared/red false color image together with both fire perimeters. Customize it appropriately including, at least, an informative title and legend. You may also want to include text on the map to identify which fire is which.
Code
# Combine the two fire perimeter datasets into a single GeoDataFrame
fires = pd.concat([eaton, palisades], ignore_index = True)

# Convert CRS of the Eaton and Palisades fire perimeter to landsat dataset CRS
fires = fires.to_crs('epsg:32611')
Code
# Initialize the map
fig, ax = plt.subplots(figsize = (10, 8))

# Plot the false color map
landsat[['swir22', 'nir08', 'red']].to_array().plot.imshow(robust = True,
                                                           ax = ax,
                                                           add_colorbar = False)

# Plot fires perimeter on false color map
fires.boundary.plot(ax = ax, color = 'red', linewidth = 2)

# Add text for first fire (adjust index and name as needed)
ax.text(fires.geometry.centroid.x.values[0] - 11000, fires.geometry.centroid.y.values[0] + 8000, 'Eaton Fire',
        fontsize = 14, weight = 'bold', color = 'white', ha = 'center', va = 'center')

# Add text for second fire (adjust index and name as needed)
ax.text(fires.geometry.centroid.x.values[-1] - 9000, fires.geometry.centroid.y.values[-1] + 5000, 'Palisades Fire', 
        fontsize = 14, weight = 'bold', color = 'white', ha = 'center', va= 'center')

# Add title to the map
plt.title('False color image for Eaton and Palisades fire', fontsize = 12, weight = 'bold')

# Remove axes ticks
ax.set_xticks([])  
ax.set_yticks([])  

# Remove axes labels
ax.set_xlabel("")  
ax.set_ylabel("")

# Add a scalebar
#ax.add_artist(ScaleBar(1, box_color="white",location="lower left"))

plt.show()

Description for the map including a brief explanation of how false color imagery is being used

This map shows a false color image made from Landsat data for Eaton and Palisades fire of the Los Angeles County. The map uses three bands: SWIR2, NIR and Red, assigned to the red, green and blue color channels. In this image, vegetation looks green because they reflect a lot of near-infrared light. The fire burned areas and bare ground looks brown. The urban areas usually appear purple or gray. The water looks black. The boundaries of the Eaton Fire and Palisades fire are delineated with red outlines. Each fire is labeled.

This combination of bands is useful for spotting burn scars and understanding fire damage because SWIR2 reacts strongly to moisture changes, and NIR highlights how healthy the vegetation is. Together, these bands make it easy to see where fires have changed the landscape.

Landsat Collection 2 Level-2. Microsoft Planetary Computer. Retrieved 15 Nov, 2025. https://planetarycomputer.microsoft.com/dataset/landsat-c2-l2.

Palisades and Eaton Dissolved Fire Perimeters. (2025) County of Los Angeles Open Data. https://data.lacounty.gov/maps/ad51845ea5fb4eb483bc2a7c38b2370c/about.

Why Is That Forest Red and That Cloud Blue?. (2014, March 4). NASA Earth Observatory. https://earthobservatory.nasa.gov/features/FalseColor.

What Are the Band Designations for the Landsat Satellites?.(2025, July 11). U.S. Geological Survey. https://www.usgs.gov/faqs/what-are-band-designations-landsat-satellites.

Common Landsat Band Combinations. (2021, November 12). U.S. Geological Survey. https://www.usgs.gov/media/images/common-landsat-band-combinations

Citation

BibTeX citation:
@online{poudel2025,
  author = {Poudel, Aakriti},
  title = {Mapping 2025 {Eaton} and {Palisades} Fires: {Environmental}
    and Social Impacts},
  date = {2025-11-29},
  url = {https://aakriti-poudel-chhetri.github.io/posts/2025-12-eaton-palisades-fires-eji/},
  langid = {en}
}
For attribution, please cite this work as:
Poudel, Aakriti. 2025. “Mapping 2025 Eaton and Palisades Fires: Environmental and Social Impacts.” November 29, 2025. https://aakriti-poudel-chhetri.github.io/posts/2025-12-eaton-palisades-fires-eji/.

© 2025, Aakriti Poudel

 

This website is built with Quarto, R and GitHub.